package net.ib.mtalk.network;

import java.net.InetAddress;
import java.net.UnknownHostException;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

/**
 * 단말기의 네트워크 상태를 확인하기 위한 메소드를 제공한다.
 */
public class NetState {

	/** 네트워크 상태 체크 실패 */
	public static final int UNCHECKED		= -2;
	/** 네트워크에 연결할 수 없음 */
	public static final int NOT_CONNECTED	= -1;
	/** Wi-Fi 네트워크 연결됨 */
	public static final int WIFI			= 0;
	/** 모바일 네트워크 연결됨 (3G...) */
	public static final int MOBILE		= 1;

	/**
	 * Network 상태를 체크한다.
	 * @param context Context 객체
	 * @return	접속된 네트워크 상태 값<br>
	 * {@link NetState#WIFI WIFI}, {@link NetState#MOBILE MOBILE},
	 * {@link NetState#NOT_CONNECTED NOT_CONNECTED}, {@link NetState#UNCHECKED UNCHECKED}
	 * @see NetworkInfo#getType()
	 */
	public static int getNetState(Context context) {
		int reVal = UNCHECKED;

		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo ni = cm.getActiveNetworkInfo();

		if (ni == null) {
			reVal = NOT_CONNECTED;
		} else if(ni.isConnected() && ni.isAvailable()) {
			int type = ni.getType();	// 라이브러리에 getType() 함수의 리턴이 무슨 값인지에 대한 명세가 없다.
			switch (type) {	// android.net 라이브러리 변경에 대응하기 위한 변환
			case 0:
				reVal = WIFI;
				break;
			case 1:
				reVal = MOBILE;
				break;
			default:
				reVal = type;
				break;
			}
		}
		
		return reVal;
	}
	
	public static int getNetState(Context context, String address) {
		// 우선 물리적 연결을 검사
		int reVal = getNetState(context);
		if (reVal == NOT_CONNECTED)
			return reVal;

		// 호스트를 찾을 수 있는지 검사
		try {
			InetAddress.getAllByName(address);
		} catch(UnknownHostException uhe) {
			reVal = NOT_CONNECTED;
		}
		
		return reVal;
	}
}
